import axios from 'axios'
import config from '@/config'
import { Message, Modal } from 'iview'
import store from '../store/index'
// 只在测试环境使用
if (process.env.NODE_ENV !== 'production') require('@/mock/exception_req')

// 状态码错误信息
const codeMessage = {
  '200': '操作成功',
  '500': '服务器发生错误，请检查服务器。',
  '000': '操作太频繁，请勿重复请求',
  '400': '请求错误',
  '401': '当前操作没有权限',
  '403': '当前操作没有权限',
  '404': '资源不存在',
  '417': '未绑定登录账号，请使用密码登录后绑定',
  '423': '演示环境不能操作，如需了解联系波波',
  '426': '用户名不存在或密码错误',
  '428': '验证码错误,请重新输入',
  '429': '请求过频繁',
  '479': '演示环境，没有权限操作',
  'default': '系统未知错误,请反馈给管理员'
}

// 创建axios实例
const service = axios.create({
  baseURL: process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro, // api的base_url
  timeout: 30000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(config => {
  if (config.url !== '/auth/oauth/token') {
    config.headers['Authorization'] = 'Bearer ' + store.state.user.token
  }
  if (store.state.token) {
    config.headers['Authorization'] = `Bearer ${store.state.token}` // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改
  }
  return config
}, error => {
  return Promise.reject(error)
})

// respone拦截器
service.interceptors.response.use(
  response => {
    const res = response    
    if (res.status === 200) {
      if (response.statusText !== 'OK') {
        Message.success(codeMessage[status])
      }
      return response.data
    }
  },
  error => {
    let errorInfo = error.response
    if (!errorInfo) {
      const { request: { statusText, status }, config } = JSON.parse(JSON.stringify(error))
      errorInfo = {
        statusText,
        status,
        request: { responseURL: config.url }
      }
    }
    if (errorInfo.status === 401 || errorInfo.status === 40101) {
      Modal.confirm({
        title: '登录超时提示',
        content: codeMessage[status],
        onOk: () => {
          location.reload()
        },
        onCancel: () => {
          store.dispatch('FedLogOut').then(() => {
            location.reload() // 为了重新实例化vue-router对象 避免bug
          })
          Message.info('取消重新登录')
        }
      })
    }else {
      Message.error(codeMessage[error.response.status])
    }
    // addErrorLog(errorInfo)
    return errorInfo
  }
)

export default service
